#进程的通信-Queue
'''
队列的基本操作：队列是单向的通道
入队：将一个数据放到队列尾部
出队：从队列的头部取出一个元素

支持队尾插入元素，队头删除元素
maxsize 队列中能窜放数据个数的上限（整数）
一旦达到上限，插入会导致阻塞，知道对垒中的数据被消费掉。
maxsize <=0 队列大小没有限制

队列先进进出原则

'''
#队列常用方法
'''
可以使用multiprocessing模块的Queue实现多进程之间的数据
传递，Queue本身是一个消息队列程序

Queue提供了一个基本FIFO窗口
初始化队列对象 q = Queue()
q.empty() q为空 返回True
q.put() 向队列中放值
q.get() 从队列中取值
q.full() 队列是否满了

'''
#基本实例
from queue import Queue
q = Queue(3)
q.put('消息1')
q.put('消息2')
print(q.full())  #False
q.put('消息3')

print(q.full())  #True
print(q.get())
print(q.get())
print(q.get())

print(q.empty()) #True
print('现在消息数量是：',q.qsize())  #查看消息数量

q.put('消息1')
q.put('消息2')
q.put('消息3')
#抛出异常
try:
    q.put('消息4',True,2)#True是block值，消息队列没空间写入时，程序进入阻塞2秒后抛出异常

except:
    print('消息队列已满，现有消息数量为：%s'% q.qsize())

print('===============================================================================')
print('\n')




#进程如何操作队列
from multiprocessing import Process,Queue
import time
import random

list1 = [1,2,3,4]
#写数据进程执行的代码
def write(q1):
    for i in list1:
        print(f'将{i}放进队列中')
        q1.put(i)
        time.sleep(random.fandom()) #random.fandom()随机生成0-1之间的浮点数

#读数据进程实行的代码
def read(q2):
    while True:
        if not a2.empty():
            info = q2.get()
            print(f'从队列中获取{info}')
            time.sleep(random.fandom())
        else:
            break
        
if __name__=='__main__':
    #实例化队列对象
    q = Queue()
    #创建进程
    p1 = Process(target=write,args=(q,))  #先写入
    p2 = Process(target=read,args=(q,))

    #启动进程
    p1.start()
    p1.join()
    p2.start()
    p2.join()
print('===============================================================================')
print('\n')

#进程间通信的本质：是共享的消息队列




